//
// Created by chen on 2021/11/30.
//
#include "getopt.h"
#include "stdio.h"

// 长参数
int long_opt(int argc, char *argv[]) {
    /*********************************************************************************
     * option
     * const char  *name;        参数名称
     * int          has_arg;     指明是否带有参数
     * int          *flag;       flag=NULL时,返回value;不为空时,*flag=val,返回0
     * int          val;         用于指定函数找到选项的返回值或flag非空时指定*flag的值
     * *******************************************************************************
     * has_arg
     * no_argument        表明长选项不带参数，如：--name, --help
     * required_argument  表明长选项必须带参数，如：--prefix /root或 --prefix=/root
     * optional_argument  表明长选项的参数是可选的，如：--help或 –prefix=/root，其它都是错误
     * */
    static struct option long_options[] = {
            {"reqarg", required_argument, NULL, 'r'},
            {"optarg", optional_argument, NULL, 'o'},
            {"noarg",  no_argument, NULL, 'n'},
            {NULL,     0,           NULL, 0}
    };
    char *string = "a::b:c:d";
    int option_index = 0;
    int opt;
    /*
     * getopt_long: 只解析长参数不解析短参数
     * long_options    指明了长参数的名称和属性
     * option_index   如果longindex非空，它指向的变量将记录当前找到参数符合longopts里的第几个元素的描述，即是longopts的下标值
     * 对于短选项，返回值同getopt函数；对于长选项，如果flag是NULL，返回val，否则返回0；对于错误情况返回值同getopt函数
     * */
    while ((opt = getopt_long(argc, argv, string, long_options, &option_index)) != -1) {
        printf("opt = %c\t\t", opt);
        printf("optarg = %s\t\t", optarg);
        printf("optind = %d\t\t", optind);
        printf("argv[optind] =%s\t\t", argv[optind]);
        printf("option_index = %d\n", option_index);
    }
}